#include <iostream>
using namespace std;

#define maxN 500005
long long NumChange = 0;
int a[maxN],temp[maxN];

void mergeSort(int *a,int l,int mid,int r) {
    // 对区间[l,r]进行归并排序
    int i = l,j = mid + 1,index = 0;

    // 归并思想：
    // 从两个数组中依次取出最小的放入到temp数组中
    // 直到取完一个数组的所有元素
    while (i <= mid && j <= r) {
        if (a[i] <= a[j]) {
            temp[index++] = a[i++];
        }else {
            temp[index++] = a[j++];
            NumChange += mid - i + 1;
        }
    }
    // 对剩下的元素进行拷贝
    while(i <= mid) temp[index++] = a[i++];
    while(j <= r) temp[index++] = a[j++];

    // 将temp数组中的元素拷贝回原数组
    for(i = l;i <= r;i++) a[i] = temp[i - l];
}

// 对区间[l,r]进行归并排序
void merge_up2down(int *a,int l,int r) {
    if (l >= r) return;
    int mid = (l + r)/2;
    merge_up2down(a,l,mid);  // 对左边进行分解
    merge_up2down(a,mid + 1,r); // 对右边进行分解
    mergeSort(a,l,mid,r);  // 对左右两边进行归并
}

int main() {
    int n;
    cin >> n;
    for(int i = 0;i < n;i++) cin >> a[i];
    merge_up2down(a,0,n - 1);
    cout << NumChange << endl;
    return 0;
}